using IFix.Core;
using System;

namespace IFix
{
	public class WrappersManagerImpl : WrappersManager
	{
		private VirtualMachine virtualMachine;

		public WrappersManagerImpl(VirtualMachine virtualMachine)
		{
			this.virtualMachine = virtualMachine;
		}

		public static ILFixDynamicMethodWrapper GetPatch(int id)
		{
			return ILFixDynamicMethodWrapper.wrapperArray[id];
		}

		public static bool IsPatched(int id)
		{
			return id < ILFixDynamicMethodWrapper.wrapperArray.Length && ILFixDynamicMethodWrapper.wrapperArray[id] != null;
		}

		public System.Delegate CreateDelegate(System.Type type, int id, object anon)
		{
			ILFixDynamicMethodWrapper iLFixDynamicMethodWrapper = new ILFixDynamicMethodWrapper(this.virtualMachine, id, anon);
			return Utils.TryAdapterToDelegate(iLFixDynamicMethodWrapper, type, "__Gen_Wrap_");
		}

		public object CreateWrapper(int id)
		{
			return new ILFixDynamicMethodWrapper(this.virtualMachine, id, null);
		}

		public object InitWrapperArray(int len)
		{
			ILFixDynamicMethodWrapper.wrapperArray = new ILFixDynamicMethodWrapper[len];
			return ILFixDynamicMethodWrapper.wrapperArray;
		}

		public AnonymousStorey CreateBridge(int fieldNum, int[] slots, VirtualMachine virtualMachine)
		{
			return new ILFixInterfaceBridge(fieldNum, slots, virtualMachine);
		}
	}
}
